from django.conf import settings
from fdfs_client.client import Fdfs_client
from rest_framework.generics import ListAPIView
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.viewsets import ModelViewSet
from goods.models import SPU, Brand, GoodsCategory
from meiduo_admin.my_paginate import MyPageNumberPagination
from meiduo_admin.spu import spu_serializers


# 继承视图集，写一个类来获取spu表的数据


class SPUViewSet(ModelViewSet):
    # 分页，要符合前端所要
    pagination_class = MyPageNumberPagination #由于数据格式与之前的相同，所以直接用先前写的分页方法
    # 序列化器
    serializer_class = spu_serializers.SPUViewSetSerializer
    # 数据源
    queryset = SPU.objects.all()

# 获取spu新增页面的品牌信息
class SPUBrandSimpleView(ListAPIView): #只是获取信息，用二级视图应该可以了吧?
    serializer_class = spu_serializers.SPUBrandSimpleSerializer
    queryset = Brand.objects.all()

# 获取spu新增页面的一级分类
class SPUCategoriesOneView(ListAPIView):
    serializer_class = spu_serializers.SPUCategoriesSerializer
    queryset = GoodsCategory.objects.filter(parent=None) #因为要的数据是一级分类，所以，要添加条件

# 获取spu新增页面的二三级分类
class SPUCategorySubView(ListAPIView):
    serializer_class = spu_serializers.SPUCategoriesSerializer
    # queryset = GoodsCategory.objects.filter() # 要获取二三级，就不能这样写，得重写get_queryset方法

    # 重写数据获取方法
    def get_queryset(self):
        # 获取前端传过来的参数
        category_id = self.kwargs.get('category_id')
        # 根据参数，返回查出响应数据
        return GoodsCategory.objects.get(id=category_id).subs.all() #因为分类模型表里，parent字段的，关联建是subs，点subs再点all()，就可以获取到其子级的数据
    #而此时，当id等于请求里的category_id的时候，就进行子级查询，返回过去

# 可以编写类视图，通过fdfs上传图片
class SPUImageUploadView(APIView): # 因为此时是要上传文件，其他类无法上传图片，所以只能继承一级视图
    def post(self,request):
        #获取参数
        image = request.FILES.get("image")

        #校验参数
        if not image: #如果没图片
            return Response(status=400) #上传失败

        #入库（fdfs）
        #1，建立FastDFS客户实例
        client = Fdfs_client(settings.FDFS_CONFIG) #把上传的文件的路径，写在dev里，配置之后，在这里导入settins，引用，
        # 找到base_url。写成，FDFS_CONFIG=os.path.join(BASE_DIR...),b是apps上面的meiduo_mall.
        #2,调用fdfs客户端上传文件方法
        ret = client.upload_by_buffer(image.read())#接着上传，用client里的upload_by_buffer方法上传图片，上传的是二进制。
        # image.read（）表示把files读取成为二进制。

        # 接着要判断上传是否成功，调试上传成功的时候，status是等于Upload successed的。通过这个判断是否成功。
        if ret['Status'] != 'Upload successed.':
            return Response(status=400)

        #返回响应,前段要的是img_url.
        # ret.get("Remote file_id",是从ret中取出来的图片的后缀。
        # 但此时只是一个后缀，还要拼接base_url。这里的base_url,是我们先前配置的访问图片的路径。
        return Response({
            "img_url":settings.BASE_URL + ret.get('Remote file_id')
        })